﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Rise.Personagens
{
    class Heroi
    {

        //instancias
        protected Texture2D textura;
        public Vector2 posicao;
        protected Vector2 velocidade;
        protected Vector2 gravidade;
        protected Rectangle origem;
        protected Rectangle destino;
        protected float rotacao;
        protected Vector2 pivo;
        public bool direita;
        public bool visivel;
        public float camada;
        protected float alfa;
        protected Color cor;
        protected Rectangle colisao;
        public bool PowerUpVelocidade;
        public int direcao; // esquerda = 0, cima = 1, direita = 2, baixo = 3

        public Rectangle Colisao
        {
            get
            {
                //AJEITAR NUMEROS MAGICOS PORRA
                return new Rectangle((int)posicao.X, (int)posicao.Y, 64, 64);
            }

            set
            {

                colisao = value;

            }

        }

        //construtor
        public Heroi(Texture2D textura)
        {
            this.textura = textura;
            this.posicao = new Vector2(0,180);
            this.velocidade = new Vector2(0.5f, 0.5f);
            this.gravidade = new Vector2(0.2f);
            this.origem = new Rectangle(0, 0, textura.Width, textura.Height);
            this.destino = new Rectangle(0, 0, origem.Width, origem.Height);
            this.rotacao = 0;
            this.pivo = Vector2.Zero;
            this.direita = true;
            this.visivel = true;
            this.camada = 1.0f;
            this.alfa = 1f;
            this.cor = new Color(1.0f, 1.0f, 1.0f, alfa);
            this.direcao = 2;

        }

        public void Update(GameTime gameTime, KeyboardState teclado, KeyboardState teclado_anterior, MouseState mouse_atual, MouseState mouse_anterior, GameWindow window)
        {
            //controles de movimento
            if (teclado.IsKeyDown(Keys.Right) || teclado.IsKeyDown(Keys.D))
            {
                posicao.X += velocidade.X * (float)gameTime.ElapsedGameTime.Milliseconds;
                this.direita = true;
                direcao = 2;
            }

            if (teclado.IsKeyDown(Keys.Left) || teclado.IsKeyDown(Keys.A))
            {
                posicao.X -= velocidade.X * (float)gameTime.ElapsedGameTime.Milliseconds;
                this.direita = false;
                direcao = 0;
            }

            //if (teclado.IsKeyDown(Keys.Up) || teclado.IsKeyDown(Keys.W))
            //{
            //    posicao.Y -= velocidade.Y * (float)gameTime.ElapsedGameTime.Milliseconds;
            //    direcao = 1;
           // }

           // if (teclado.IsKeyDown(Keys.Down) || teclado.IsKeyDown(Keys.S))
          //  {
           //     posicao.Y += velocidade.Y * (float)gameTime.ElapsedGameTime.Milliseconds;
           //     direcao = 3;
           // }

            if (teclado.IsKeyDown(Keys.Space))
            {
                posicao.Y += gravidade.Y * (float)gameTime.ElapsedGameTime.Milliseconds;         
            }
            
            //limitação de movimentação do personagem
            if (posicao.X >= window.ClientBounds.Width - destino.Width)
            {
                posicao.X = window.ClientBounds.Width - destino.Width;
            }

            if (posicao.Y >= window.ClientBounds.Height - destino.Height)
            {
                posicao.Y = window.ClientBounds.Height - destino.Height;
            }

            if (posicao.Y <= 0)
            {
                posicao.Y = 0;
            }

            if (posicao.X <= 0)
            {
                posicao.X = 0;
            }

            //checar powerup
            if (PowerUpVelocidade)
            {

                this.velocidade = new Vector2(1f, 1f);

            }
            else
            {

                this.velocidade = new Vector2(0.5f, 0.5f);

            }

            
        }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {

            if (visivel)
            {
                spriteBatch.Draw(
                    textura,
                    new Rectangle((int)posicao.X, (int)posicao.Y, textura.Width, textura.Height),
                    null,
                    Color.White,
                    0.0f,
                    Vector2.Zero,
                     (direita) ? SpriteEffects.None : SpriteEffects.FlipHorizontally,
                     camada);
            }

            
        }

        public bool Colidiu(Objetos.Plataforma plataforma)
        {
            if (Colisao.Intersects(plataforma.Colisao))
            {

                return true;

            }
            else
            {

                return false;

            }


        }

        public bool Colidiu(Objetos.PowerUp PowerUp)
        {
            if (Colisao.Intersects(PowerUp.Colisao))
            {

                return true;

            }
            else
            {

                return false;

            }


        }

        public bool Colidiu(Personagens.Inimigo inimigo)
        {
            if (Colisao.Intersects(inimigo.Colisao))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}